10분 안에 Ruby 배우기
Ruby는 우아한 문법과 개발자 친화적인 기능으로 유명한 동적 객체 지향 프로그래밍 언어입니다. 이 튜토리얼은 Ruby의 핵심 개념을 다루어 빠르게 언어를 배울 수 있도록 도와줍니다.
1. 첫 번째 Ruby 프로그램 작성하기
간단한 프로그램부터 시작해보겠습니다. hello.rb
라는 파일을 생성하고 다음 코드를 입력하세요:
puts "Hello, World!"
파일을 저장하고 터미널에서 다음 명령어를 실행하세요:
ruby hello.rb
출력 결과는 다음과 같습니다:
Hello, World!
이 간단한 프로그램은 Ruby의 기본 출력 기능을 보여줍니다. puts
메서드는 콘솔에 텍스트 정보를 표시하는 데 사용됩니다.
2. 기본 문법
Ruby의 문법은 깔끔하고 가독성이 좋으며, 자연스럽고 직관적으로 설계되었습니다.
# 이것은 주석입니다
puts "Hello, World!"
Ruby의 기본 문법 규칙:
- 주석: 한 줄 주석은
#
으로 시작하고, 여러 줄 주석은=begin
과=end
를 사용합니다. - 문장: 일반적으로 한 줄에 하나의 문장을 작성하며, 끝에 세미콜론
;
이 필요하지 않습니다. - 코드 블록:
do...end
또는 중괄호{}
로 정의합니다. - 메서드 호출: 인수가 없는 메서드 호출에는 괄호를 생략할 수 있습니다.
여러 줄 주석 예시:
=begin
이것은 여러 줄 주석입니다,
여러 줄에 걸쳐 있습니다.
=end
3. 변수와 데이터 타입
Ruby에서 변수는 동적으로 타입이 지정되며 명시적 타입 선언이 필요하지 않습니다.
기본 변수 명명 규칙:
- 변수 이름은 문자, 숫자, 밑줄만 포함할 수 있습니다.
- 변수 이름은 숫자로 시작할 수 없습니다.
- 변수 이름은 대소문자를 구분합니다.
- Ruby 키워드는 변수 이름으로 사용할 수 없습니다.
Ruby의 주요 기본 데이터 타입:
- 정수 (Integer): 예:
42
또는-10
- 부동소수점 (Float): 예:
3.14
또는2.5e3
- 문자열 (String): 예:
"hello"
또는'world'
, 작은따옴표나 큰따옴표 사용 - 불리언 (Boolean):
true
또는false
- Nil (Nil):
nil
로 표현되며, null 또는 값 없음을 나타냄 - 심볼 (Symbol): 예:
:name
, 불변 식별자
3.1 숫자 타입
Ruby는 정수와 부동소수점 숫자를 지원합니다.
# 정수
age = 25
population = 1_000_000 # 가독성을 위한 밑줄
# 부동소수점
temperature = 36.5
pi = 3.14159
# 연산
puts 10 + 5 # 15
puts 10 / 3 # 3 (정수 나눗셈)
puts 10.0 / 3 # 3.333... (부동소수점 나눗셈)
3.2 문자열
문자열은 문자 시퀀스로, 작은따옴표나 큰따옴표로 묶습니다.
single_quote = '작은따옴표 문자열'
double_quote = "큰따옴표 문자열"
multiline = "이것은
여러 줄
문자열입니다"
# 문자열 보간 (큰따옴표에서만 가능)
name = "Alice"
greeting = "안녕하세요, #{name}!"
puts greeting # "안녕하세요, Alice!"
문자열 연산:
text = "Ruby 프로그래밍"
puts text.length # 문자열 길이
puts text.upcase # 대문자로 변환
puts text.downcase # 소문자로 변환
puts text[0] # 첫 번째 문자 접근
puts text[0..3] # 문자열 슬라이싱
puts text.include?("Ruby") # 포함 여부 확인
3.3 불리언 타입
불리언 타입은 true
와 false
두 가지 값을 가집니다.
is_active = true
is_complete = false
# 불리언 연산
result1 = true && false # false
result2 = true || false # true
result3 = !true # false
3.4 Nil 타입
nil
은 null 또는 값 없는 상태를 나타냅니다.
value = nil
if value.nil?
puts "값이 null입니다"
end
3.5 심볼
심볼은 불변 식별자로, 주로 해시의 키로 사용됩니다.
:name
:email
:created_at
# 심볼 vs 문자열
puts :name.object_id == :name.object_id # true (같은 객체)
puts "name".object_id == "name".object_id # false (다른 객체)
4. 데이터 구조
Ruby는 데이터를 저장하고 조작하기 위한 여러 내장 데이터 구조를 제공합니다.
4.1 배열
배열은 여러 값을 보관할 수 있는 순서가 있는 컬렉션입니다.
numbers = [1, 2, 3, 4, 5]
numbers.push(6) # 요소 추가
numbers.unshift(0) # 시작 부분에 삽입
numbers.delete(3) # 특정 값 제거
numbers[0] = 10 # 요소 수정
puts numbers.inspect # [10, 2, 4, 5, 6]
배열 연산:
numbers = [10, 20, 30, 40, 50]
puts numbers[1..3] # [20, 30, 40]
puts numbers.first # 10
puts numbers.last # 50
puts numbers.include?(30) # true
4.2 해시
해시는 키-값 쌍의 컬렉션으로, 다른 언어의 딕셔너리와 유사합니다.
student = {
name: "John",
age: 20,
major: "Computer Science"
}
# 해시 접근 및 수정
puts student[:name]
student[:age] = 21
student[:gpa] = 3.8
# 해시 순회
student.each do |key, value|
puts "#{key}: #{value}"
end
5. 제어 흐름
Ruby는 프로그램 실행을 관리하기 위한 여러 제어 흐름 문을 제공합니다.
5.1 if 문
if
문은 조건을 평가하고 조건이 참일 때 블록을 실행합니다.
age = 20
if age >= 18
puts "성인"
elsif age >= 13
puts "청소년"
else
puts "어린이"
end
# 한 줄 if
puts "성인" if age >= 18
5.2 unless 문
unless
는 if
의 반대로, 조건이 거짓일 때 실행됩니다.
age = 15
unless age >= 18
puts "성인이 아닙니다"
end
# 한 줄 unless
puts "성인이 아닙니다" unless age >= 18
5.3 case 문
case
문은 여러 조건을 처리하는 깔끔한 방법을 제공합니다.
grade = "B"
case grade
when "A"
puts "우수"
when "B"
puts "좋음"
when "C"
puts "보통"
else
puts "개선 필요"
end
5.4 반복문
Ruby는 다양한 반복 구조를 지원합니다.
while 반복문:
count = 0
while count < 5
puts count
count += 1
end
until 반복문:
count = 0
until count >= 5
puts count
count += 1
end
for 반복문:
for i in 0..4
puts i
end
each 반복자:
(0..4).each do |i|
puts i
end
# 배열과 함께 사용
fruits = ["apple", "banana", "cherry"]
fruits.each do |fruit|
puts fruit
end
break와 next:
(0..9).each do |i|
break if i == 5 # 반복문 종료
next if i % 2 == 0 # 짝수 건너뛰기
puts i # 출력: 1, 3
end
6. 메서드
Ruby에서 메서드는 def
키워드를 사용하여 정의합니다.
기본 메서드 정의:
def greet(name)
"안녕하세요, #{name}!"
end
# 메서드 호출
message = greet("John")
puts message
기본 매개변수:
def greet(name, greeting = "안녕하세요")
"#{greeting}, #{name}!"
end
puts greet("Alice") # "안녕하세요, Alice!"
puts greet("Bob", "안녕") # "안녕, Bob!"
가변 인수:
def sum_numbers(*numbers)
numbers.sum
end
puts sum_numbers(1, 2, 3, 4) # 10
키워드 인수:
def create_person(name:, age:, city: "Unknown")
{ name: name, age: age, city: city }
end
person = create_person(name: "Alice", age: 25)
puts person.inspect
7. 블록과 Proc
블록은 메서드에 전달할 수 있는 코드 덩어리입니다.
블록 사용:
# do...end 사용
3.times do
puts "안녕하세요!"
end
# 중괄호 사용
3.times { puts "안녕하세요!" }
# 매개변수가 있는 블록
(1..3).each do |number|
puts "숫자: #{number}"
end
Yield 키워드:
def run_block
puts "블록 전"
yield
puts "블록 후"
end
run_block { puts "블록 내부" }
Proc:
Proc은 블록을 캡슐화하는 객체입니다.
square = Proc.new { |x| x * x }
puts square.call(5) # 25
# 메서드에 Proc 전달
def apply_operation(numbers, operation)
numbers.map { |n| operation.call(n) }
end
numbers = [1, 2, 3, 4]
squares = apply_operation(numbers, square)
puts squares.inspect # [1, 4, 9, 16]
8. 클래스와 객체
Ruby는 모든 것이 객체인 순수 객체 지향 언어입니다.
기본 클래스 정의:
class Person
def initialize(name, age)
@name = name
@age = age
end
def introduce
"저는 #{@name}이고, #{@age}살입니다"
end
def have_birthday
@age += 1
"#{@name}의 생일입니다, 이제 #{@age}살이 되었습니다"
end
end
# 객체 생성
person1 = Person.new("John", 25)
person2 = Person.new("Jane", 30)
puts person1.introduce
puts person2.have_birthday
접근자 메서드:
class Person
attr_reader :name # 읽기 접근
attr_writer :age # 쓰기 접근
attr_accessor :city # 읽기/쓰기 접근
def initialize(name, age, city)
@name = name
@age = age
@city = city
end
end
person = Person.new("Alice", 25, "New York")
puts person.name # "Alice"
person.age = 26 # 나이 설정
person.city = "Boston" # 도시 설정
puts person.city # "Boston"
클래스 메서드와 변수:
class Student
@@student_count = 0 # 클래스 변수
def initialize(name)
@name = name
@@student_count += 1
end
def self.student_count # 클래스 메서드
@@student_count
end
end
student1 = Student.new("John")
student2 = Student.new("Jane")
puts Student.student_count # 2
상속:
class Animal
def initialize(name)
@name = name
end
def speak
"#{@name}가 소리를 냅니다"
end
end
class Dog < Animal
def speak
"#{@name}가 짖습니다"
end
end
class Cat < Animal
def speak
"#{@name}가 야옹합니다"
end
end
dog = Dog.new("Buddy")
cat = Cat.new("Mimi")
puts dog.speak # "Buddy가 짖습니다"
puts cat.speak # "Mimi가 야옹합니다"
9. 모듈과 믹스인
모듈은 관련 메서드와 상수를 그룹화하는 데 사용되며, 클래스에 혼합될 수 있습니다.
모듈 정의:
module Speakable
def speak
"#{@name}가 무언가를 말합니다"
end
end
class Person
include Speakable
def initialize(name)
@name = name
end
end
person = Person.new("Alice")
puts person.speak # "Alice가 무언가를 말합니다"
모듈을 이용한 네임스페이싱:
module Math
PI = 3.14159
def self.square(x)
x * x
end
end
puts Math::PI # 3.14159
puts Math.square(5) # 25
10. 예외 처리
Ruby는 begin
, rescue
, ensure
, raise
를 사용하여 강력한 예외 처리를 제공합니다.
기본 예외 처리:
begin
result = 10 / 0
rescue ZeroDivisionError => e
puts "0으로 나눌 수 없습니다: #{e.message}"
else
puts "나눗셈 성공"
ensure
puts "이것은 항상 실행됩니다"
end
예외 발생:
def divide(a, b)
raise "0으로 나눌 수 없습니다" if b == 0
a / b
end
begin
result = divide(10, 0)
rescue => e
puts "오류: #{e.message}"
end
11. 파일 작업
Ruby는 파일 읽기와 쓰기를 위한 간단한 메서드를 제공합니다.
파일 읽기:
# 전체 파일 읽기
content = File.read("example.txt")
puts content
# 줄 단위로 읽기
File.foreach("example.txt") do |line|
puts line.chomp
end
파일 쓰기:
# 파일에 쓰기
File.write("output.txt", "안녕하세요, Ruby!\n")
# 파일에 추가
File.open("output.txt", "a") do |file|
file.puts "새로운 내용을 추가합니다."
end
12. 유용한 내장 메서드
Ruby는 많은 유용한 내장 메서드를 제공합니다.
문자열 메서드:
text = " Ruby 프로그래밍 "
puts text.strip # 공백 제거
puts text.split(" ") # 배열로 분할
puts text.gsub("Ruby", "Python") # 교체
배열 메서드:
numbers = [3, 1, 4, 1, 5, 9, 2]
puts numbers.sort.inspect # [1, 1, 2, 3, 4, 5, 9]
puts numbers.uniq.inspect # [3, 1, 4, 5, 9, 2]
puts numbers.select { |n| n > 3 }.inspect # [4, 5, 9]
해시 메서드:
person = { name: "Alice", age: 25, city: "New York" }
puts person.keys.inspect # [:name, :age, :city]
puts person.values.inspect # ["Alice", 25, "New York"]
puts person.has_key?(:age) # true
13. Ruby Gems
RubyGems는 라이브러리 설치 및 관리를 위한 Ruby의 패키지 관리자입니다.
Gems 설치:
gem install rails
코드에서 Gems 사용:
require 'json'
# JSON 파싱
json_string = '{"name": "Alice", "age": 25}'
person = JSON.parse(json_string)
puts person["name"] # "Alice"
# JSON 생성
person_hash = { name: "Bob", age: 30 }
json_output = JSON.generate(person_hash)
puts json_output # {"name":"Bob","age":30}
14. Ruby 스타일 가이드
Ruby는 깔끔하고 가독성 있는 코드를 장려하는 강력한 커뮤니티 스타일 가이드를 가지고 있습니다.
들여쓰기: 들여쓰기에 2개의 공백을 사용합니다.
명명 규칙:
- 변수와 메서드:
snake_case
- 클래스와 모듈:
CamelCase
- 상수:
SCREAMING_SNAKE_CASE
괄호: 인수가 있는 메서드 호출에는 괄호를 사용하고, 인수가 없는 메서드 호출에는 괄호를 생략합니다.
블록: 여러 줄 블록에는 do...end
를, 한 줄 블록에는 {}
를 사용합니다.
Ruby의 우아한 문법과 강력한 기능은 작업을 즐겁게 만듭니다. 개발자의 행복과 생산성에 초점을 맞춘 점은 웹 개발, 스크립팅, 자동화 작업에서 인기 있는 언어가 되었습니다.